package io.renren.common.config.rabbit;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.impl.AMQImpl;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @ClassName MqListenerTest
 * @Description: TODO
 * @Author HeJie  734412450@qq.com
 * @Date 2021/1/24  21:59
 * @Version V1.0
 **/
@Component
public class MqListenerTest {

//    @RabbitListener(queues = {"admin_test_queue"})
//    void getMsg(Message msg, String str ){
//        System.out.println(msg);
//    }
    /**
     *  1） Queue可以由多个队列监听，但同一个消息，只能由一个客户端收到
     *  2） 一个消息只有完全处理完，即方法结束，才能接受下一个消息
     *
     * 功能描述
     *
     * @Param msg: 消息
     * @Param str: 消息体类型，可直接获取消息对象，不需要使用Json工具转化为对象
     * @Param channel: 通道（传输数据的通道，一个客户端只可以建立一个通道）,用于回复ack
     */
    @RabbitListener(queues = {"admin_test_queue"})
    void getMsg(Message msg, String str, Channel channel){
        // 消息体，该消息为字节数据。需要使用json工具将其转化为对象
        byte[] body = msg.getBody();
        // 消息头
        msg.getMessageProperties();
        System.out.println(str);
        // 回复服务器已处理完消息  参数1:channel按顺序自增的    参数2:是否批量回复,false -> 处理完一个消息回复一个ack
        try {
            channel.basicAck(msg.getMessageProperties().getDeliveryTag(),false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}